const oldArrayPrototype = Array.prototype;
export const arrayMethods = Object.create(oldArrayPrototype); // 调用push pop unshift shift reverse splice sort 七个方法时，先调用arrayMethods,再去调用array原型的方法，其他方法在arrayMethods没有，会自动找到array原型的方法

['push', 'pop', 'unshift', 'shift', 'splice', 'sort', 'reverse'].forEach(method => {
    // 调用这些方法传递的参数
    arrayMethods[method] = function (...args) {
        let result = oldArrayPrototype[method].call(this, ...args);
        // 1 这里会拦截数组方法，收集依赖并且触发试图更新
        // 2 如果时数组增添进来的，要对增添进来的稍作处理
        let insert;
        let ob = this.__ob__;
        switch(method) {
            case "push":
            case "unshift":
                insert = args;
                break;
            case "splice":
                insert = args.slice(2); // splice是从第二项开始，是增加的
                break;
            default:
                break;
        } 
        if (insert) {
            // 需要拿到Observer实例的observeArray方法
            ob.observeArray(insert);
            // 调用这七个方法是更新试图
            ob.dep.notify();
            
        }
        return result;
    }
})